#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
/*
    #include <pthread.h>(以下函数都只要这个头文件)

    pthread_t pthread_self(void);
    功能：获取当前线程的线程号
    参数：无
    返回值：返回调用线程的id号，不会失败


    void pthread_exit(void *retval);
    功能：退出当前线程
    参数：表示退出时的状态，一般填NULL
    返回值：无
    //线程函数return NULL也是结束，两者功能一样的，这个就多一个退出是状态而已

    int pthread_join(pthread_t thread, void **retval);
    功能：阻塞回收指定线程的资源
    参数1：要回收的线程线程号
    参数2：线程退出时的状态，一般填NULL(这个是和pthread_exit的参数对应，一般不需要用)
    返回值：成功返回0，失败返回一个错误码


    int pthread_detach(pthread_t thread);
    功能：将指定线程设置成分离态，被设置成分离态的线程，退出后，资源由系统自动回收
    参数：要分离的线程号
    返回值：成功返回0，失败返回一个错误码
*/
void *task(void *arg)
{

    printf("分支线程在运行\n");
    printf("分支线程号tid=%#lx\n", pthread_self()); // 获得当前线程的tid
    sleep(2);

    pthread_exit(NULL); // 退出线程(一般参数填NULL就行了)
    // return NULL;   // 跟上面等价
}

int main(int argc, const char *argv[])
{

    pthread_t tid = -1;
    if (pthread_create(&tid, NULL, task, NULL) != 0)
    {
        printf("tid create error\n");
        return -1;
    }
    printf("在主线程中打印子线程号tid=%#lx\n", tid);
    printf("主线程号tid=%#lx\n", pthread_self()); // 获得主线程号

    // 以阻塞的方式等待子线程结束然后回收资源
    pthread_join(tid, NULL);

    printf("子线程资源已回收\n");
    // pthread_detach(tid);   //非阻塞回收
    printf("主线程结束,进入while循环\n");
    while (1)
        ;

    return 0;
}